package Static内部类;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: lenovo
 * Date: 2022-06-26
 * Time: 16:00
 */
class OuterClass{
    //外部类成员属性
    public int a=1;
    private int b=2;
    static int c=3;
    public OuterClass outerClass;
    public void fun(){
        System.out.println("外部类方法");
    }
    static class InnerClass{
        //静态内部类里的成员变量
        public int a=4;
        private int e=5;
        static int f=6;
        static int c = 7;
        public int l = 20;
        public OuterClass outer;

//        public InnerClass(OuterClass outerClass){
//            System.out.println("静态内部类的构造方法");
//            this.outerClass = outerClass;
//        }
//静态内部类里的无参构造方法
        public InnerClass() {

        }
//静态内部类里的有参构造方法 参数是引用
        public InnerClass(OuterClass outerClass) {
            this.outer = outerClass;
        }
//静态内部类里的普通成员方法
        public void fun(){
            System.out.println("静态内部类的方法");
         //静态内部类里的成员 可以直接访问
            System.out.println(c);
            System.out.println(OuterClass.c);
//            System.out.println(e);
//            System.out.println(f);
            //静态内部类里可以直接访问外部类的静态成员变量
//            System.out.println(OuterClass.c);
//            //构造外部类对象
            OuterClass outerClass = new OuterClass();
       ////   System.out.println(OuterClass.this.a);
//            System.out.println("外部类"+outerClass.a+" "+outerClass.b);
            System.out.println(outer.a);
            System.out.println(outer.b);

        }
        //静态内部类里的静态方法 静态方法只能直接访问静态属性和方法
        public static void test(){
            System.out.println(f);//访问静态内部类的静态变量
            System.out.println(OuterClass.c);//访问外部类的静态变量
            //创建外部类对象的引用 再来访问外部类的非static属性
            OuterClass outerClass = new OuterClass();
            System.out.println(outerClass.a);
        }
    }

    //外部类访问静态内部类 需要实例化出静态内部类的对象
    public void fun1(){
//        //实例化出静态内部类的对象
//        OuterClass.InnerClass innerClass = new InnerClass();
//        //访问静态内部类非静态类的成员
//        System.out.println(innerClass.d);
//        //访问静态内部类的静态成员和方法
//        System.out.println(innerClass.f);
//        innerClass.test();
       // System.out.println(l);
    }
}
public class Test {
    public static void main(String[] args) {
        //static内部类实例化
        //OuterClass.InnerClass innerClass = new OuterClass.InnerClass(new OuterClass());
        //静态内部类的实例化不需要依靠外部类对象的引用
        OuterClass.InnerClass innerClass = new OuterClass.InnerClass();
        //通过静态内部类引用访问静态内部类里的成员方法
        innerClass.fun();
//        //通过外部类类名.静态内部类类名的类名来访问静态内部类的静态方法
//        OuterClass.InnerClass.test();
        //innerClass.test();//静态方法不推荐通过对象的引用来调用
        //创建外部类的对象引用
//        OuterClass outerClass = new OuterClass();
//        outerClass.fun1();
    }
}
